<?php namespace app\system\controller;

use houdunwang\dir\Dir;
use houdunwang\request\Request;
use houdunwang\route\Controller;
use houdunwang\validate\Validate;
use houdunwang\view\View;
use system\model\Module as ModuleModel;

/**
 *  模块控制器类
 * Class Module
 * @package app\system\controller
 */
class Module extends Common
{

    public function __construct()
    {
        $this->auth();
        $this->assignModuleData();
    }

    public function assignModuleData()
    {
        //找到module数据表，做判断 module_is_system = 0 ，会获取全部数据(不是系统模块)
        $moduleData = Db::table('module')->where('module_is_system', 0)->get();
//        p($moduleData);die;
        View::with('moduleData', $moduleData);

    }

    //动作
    public function index(ModuleModel $module)
    {
        //2.取数据扫描，那些模块是已经安装过了
        //在模板页面区别对待
        //pluck获取单一字段，获取出来的结果是一个字符串
        //lists获取单一一列字段值
        $isInstalledModule = $module->where('module_is_system', 0)->lists('module_name');
        //p($isInstalledModule);
        //1.先扫描addons/，看有多少模块
        $modules = Dir::tree('addons');
//        p($modules);die;
        //4.声明空数组
        $data = [];
        //3.处理是否已经安装、页面要循环的模块数据
        foreach ($modules as $k => $v) {
//            p($v);die;
            //判断，如果模块中没有manifest.php文件，视为不合法模块
            $manifestFile = 'addons/' . $v['basename'] . '/manifest.php';
//            p($manifestFile);die;
            if (is_file($manifestFile)) {
                $config = include $manifestFile;
                $config['isinstall'] = in_array($v['basename'], $isInstalledModule);
                $data[] = $config;
            }
        }
//		p( $data );die;

        //此处书写代码...
        //$data = $module->where('module_is_system',0)->paginate(20);

        return view('', compact('data'));
    }

    //设计模块
    public function design(ModuleModel $module)
    {
        if (IS_POST) {
            //1.接受post数据
            $post = Request::post();
            //p($post);die;
            Validate::make(
                [
                    ['module_title', 'required', '请输入模块中文名称', Validate::MUST_VALIDATE],
                    ['module_name', 'required', '请输入模英文标识', Validate::MUST_VALIDATE],
                    ['module_name', 'regexp:/^[a-z]{3,10}$/', '模块标识必须为英文字母', Validate::MUST_VALIDATE],
                ]
            );
            //2.判断不能重复创建模块
            //考虑规范，采用目录全部小写
            $post['module_name'] = strtolower($post['module_name']);
            //在addons或者module检测，创建的模块已存在，则不允许重复创建【目录已经存在，代表是模块已经存在】
            if (is_dir("addons/{$post['module_name']}") || is_dir("module/{$post['module_name']}")) {
                return ['valid' => 0, 'message' => '模块已存在，不能重复创建'];
            }
            //3.创建出模块的基本目录结构
            $dirs = [
                'controller',
                'model',
                'system',
                'template',
            ];
            foreach ($dirs as $dir) {
                //Dir::create（）在hdphp手册中组件--目录操作
                Dir::create("addons/{$post['module_name']}/{$dir}");
            }
            //4.生成文件
            $module_name = $post['module_name'];
            $content = <<<str
<?php namespace addons\\{$module_name}\system;

use module\Hdprocessor;

/**
 * 微信处理器
 * Class Processor
 * @package addons\\{$module_name}\system
 */
class Processor extends Hdprocessor
{
	public function handler()
	{

	}
}
str;
            file_put_contents("addons/{$post['module_name']}/system/Processor.php", $content);
            //5.数据存储到数据库
            //$module->save( $post );
            //2017年06月27日将原先的第五步进行修改
            //设计模块的时候不需要写入数据库，只生成addons/目录就好
            file_put_contents('addons/' . $module_name . '/manifest.php', "<?php\r\nreturn " . var_export($post, true) . ";\r\n?>");

            return ['valid' => 1, 'message' => '模块设计成功'];
        }

        return view();
    }

    //安装模块
    public function install(ModuleModel $module)
    {
        $module_name = Request::get('module_name');
        $data = include 'addons/' . $module_name . '/manifest.php';
        $module->save($data);
        return $this->setRedirect('index')->success('操作成功');
    }

    //模块卸载
    public function uninstall()
    {
        //接受要删除模块module_name[英文标识]
        $module_name = Request::get('module_name');
        //p($module_name);//pic
        //1.把该模块对应的目录删除

        //2.删除数据库对应数据
        ModuleModel::where('module_name', $module_name)->delete();

        //3.成功提示
        return $this->setRedirect('index')->success('操作成功');
    }
}
